<?php

namespace app\controller;

use support\Request;
use support\Db;

class Index
{
    public function index(Request $request)
    {
        static $readme;
        if (!$readme) {
            $readme = file_get_contents(base_path('README.md'));
        }
        $id = intval($request->get('id'));
        var_dump($id);
        return $readme;
    }

    public function view(Request $request)
    {
        
        set_time_limit(0);
        //设置程序运行内存
        ini_set('memory_limit', '2000M');

        // //要导出的数据
        // $sql = 'SELECT goods_id,goods_name,supplier_id,content FROM `yoshop_goods`  where goods_id < 1000000';
        $sql = 'SELECT item_id,title,list_price,barcode,oc_code,oc_name,shop_item_price,shop_item_attribute FROM `winxuan_book`  limit 0,100000';
        $mark = 'export';
        return $this->exportCsv($sql, $mark);

    }


    public function json(Request $request)
    {
        //离弦之箭---调用方法
        $time_out = 10;
        \app\model\Arrow::getInstance()->run(function() use ($time_out){
            //这里写我们要执行的代码
            echo '进入回调：'.time().PHP_EOL;
            $sql = 'SELECT item_id,title,list_price,barcode,oc_code,oc_name,shop_item_price,shop_item_attribute FROM `winxuan_book`  limit 0,10000';
            $mark = 'export';
            $this->saveCsv($sql, $mark);
            echo '任务执行完毕：'.time().PHP_EOL;
        });


        return json(['code' => 1, 'msg' => 'ok']);
    }
    function saveCsv($sql, $fileName)
    {
        echo "任务执行开始：".time().PHP_EOL;
        $fileName .= time();
        $fp = fopen("public/$fileName.csv", 'a');
        if(!$fp){
            echo "文件打开失败：".time().PHP_EOL;
        }
        //添加BOM头，以UTF8编码导出CSV文件，如果文件头未添加BOM头，打开会出现乱码。
        fwrite($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));
        //添加导出标题
        fputcsv($fp, ['item_id', 'title', 'list_price', 'barcode','oc_code','oc_name','shop_item_price','shop_item_attribute']);
        echo "任务循环开始：".time().PHP_EOL;
        foreach ($this->getExportData($sql) as $item) {
            //向csv表格中添加每一行数据
            fputcsv($fp, $item);
        }
        fclose($fp);  //每生成一个文件关闭
        echo "任务执行结束:".time().PHP_EOL;


    }

    function exportCsv($sql, $fileName)
    {
       
        ob_start();
        //打开php标准输出流
        $fp = fopen('php://output', 'a');
        //添加BOM头，以UTF8编码导出CSV文件，如果文件头未添加BOM头，打开会出现乱码。
        fwrite($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));
        //添加导出标题
        fputcsv($fp, ['item_id', 'title', 'list_price', 'barcode','oc_code','oc_name','shop_item_price','shop_item_attribute']);

        foreach ($this->getExportData($sql) as $item) {
            //向csv表格中添加每一行数据
            fputcsv($fp, $item);
            unset($item);
        }
        fclose($fp);  //每生成一个文件关闭

        $csv = ob_get_clean();
        echo "任务执行结束".time().PHP_EOL;
        return response($csv)->header('Content-Type', 'text/csv');

    }


    /**
     * 获取要导出的数据
     * 使用迭代生成器来缓存mysql查询结果，返回类型为数组
     * @param $sql
     * @return Generator
     */
    function getExportData($sql)
    {
        //连接数据库
        echo "数据库链接:".time().PHP_EOL;;
        // $con = mysqli_connect("localhost", "webman", "ffXbWj3PZyPrAymr");
        $con = mysqli_connect("139.155.41.173", "card", "Kjd2aDrJ3dKjB4Kf");
        //连接数据库报错信息
        if (!$con) {
            die('Could not connect: ' . mysqli_error());
        }
        mysqli_select_db($con, "card");
        mysqli_query($con, 'set names utf8');
        //该处用 MYSQLI_USE_RESULT 就是不缓存结果集中，也是为了避免内存溢出，相当于mysql_unbuffered_query  MYSQLI_STORE_RESULT
        
        echo "初始占用内存:".round(memory_get_usage() / 1024 / 1024, 2) . ' MB' . PHP_EOL;
        $i=0;
        foreach (mysqli_query($con, $sql, MYSQLI_USE_RESULT) as $row) {  //
            yield $row;
            if (($i % 1000) == 0) {
                // 内存使用以 MB 为单位
                echo "第 $i 次占用内存:".round(memory_get_usage() / 1024 / 1024, 2) . ' MB'. PHP_EOL;
            }
            $i++;
        }
        $con->close();
    }



}
